package io.sdph.order;

import io.sdph.documents.model.Invoice;
import io.sdph.order.exceptions.OrderException;
import io.sdph.order.model.Order;
import io.sdph.products.model.Product;
import io.sdph.userprofile.model.User;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Interfejs managera do zarządzania zamówieniami.
 * 
 * @author Konrad Szewczyk, Adrian Szwajkowski, Tomasz Korpowski
 * @since 0.0.1
 */
public interface IOrderManager {
	/**
	 * Metoda tworzy zamówienie i zapisuje je do bazy danych.
	 * 
	 * @param user - użytkownik, na którego zostanie złożone zamówienia
	 * @param products - mapa produktów na ich ilości
	 * @return obiekt zamówienia
	 * @throws OrderException - przy błędach
	 */
	public Order order(Map<Product, Long> products, Map<String, String> properties, Invoice invoice) throws OrderException;
	
	/**
	 * Anuluje dane zamówienia.
	 * 
	 * @param order - obiekt zamówienia
	 * @throws OrderException - w przypadku błędów
	 */
	public void cancelOrder(Order order) throws OrderException;
	
	/**
	 * Anuluje dane zamówienie.
	 * 
	 * @param orderId - id zamówienia
	 * @throws OrderException - w przypadku błędów
	 */
	public void cancelOrder(String orderId) throws OrderException;
	
	/**
	 * Pobiera zamówienia danego użytkownika
	 * 
	 * @param user - obiekt użytkownika
	 * @return lista aktywnych zamówień
	 * @throws OrderException - w przypadku błędów
	 */
	public List<Order> getUserOrders(User user) throws OrderException;
	
	/**
	 * Pobiera historie zamówień użytkownika z zakresu podanych dni
	 * 
	 * @param user - obiekt użytkownika
	 * @param dateFrom - data poczatkowa
	 * @param dateTo - data końcowa
	 * @return lista zamówień użytkownika z podanego zakresu dni
	 * @throws OrderException - w przypadku błędów
	 */
	public List<Order> getUserOrderHistory(User user, Date dateFrom, Date dateTo) throws OrderException;
	
	/**
	 * Uzupelnia zamowienie uzytkownika
	 * @param order - obiekt zamowienia
	 * @throws OrderException - w przypadku bledów
	 */
	public void fill(Order order) throws OrderException;
	
	/**
	 * Pobiera zamówienie użytkownika.
	 * @param orderId - id zamówienia
	 * @return order - obiekt zamówienia
	 * @throws OrderException - w przypadku bledów
	 */
	public Order getOrder(String orderId) throws OrderException;
}
